﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Triunfadores.BusinessEntities;
using Triunfadores.Repository.Service;

namespace Triunfadores.Repository
{
    public class ClienteRepository:MasterRepository,IClienteRepository
    {
        /// <summary>
        /// Busqueda de un cliente de cualquier TIPO
        /// </summary>
        /// <param name="dni"></param>
        /// <returns>Devuelve un cliente</returns>
        public Cliente FindSearchingFromClienteByDni(string dni)
        {
            var query = from p in Context.Clientes
                        .Include("TipoCliente")
                where p.Dni.Equals(dni)
                select p;

            return query.SingleOrDefault();

        }

        public void AddCliente(Cliente cliente)
        {
            cliente.IcDetallesCliente.ForEach(i => Context.Entry(i.Beneficiario).State = EntityState.Unchanged);

            Context.Clientes.Add(cliente);
            Context.SaveChanges();
        }

        public void UpdateCliente(Cliente cliente)
        {
            //Context.Entry(cliente.Beneficiario).State = EntityState.Unchanged;

            Context.Entry(cliente).State = EntityState.Modified;
            Context.SaveChanges();
        }

        public void DeleteCliente(int id)
        {
            throw new NotImplementedException();
        }

        public Cliente GetClienteById(int id)
        {
            return Context.Clientes.Find(id);
        }


        /// <summary>
        /// Busqueda de un cliente que solo pertenece al TIPO CLIENTE "Socio"
        /// </summary>
        /// <param name="dni"></param>
        /// <returns>Retorna un cliente de Tipo Socio</returns>
        public Cliente FindSearchingFromAvaladorByDni(string dni)
        {
            var query = from p in Context.Clientes
                        where (p.Dni.Equals(dni) && p.TipoCliente.Tipo == "Socio")
                        select p;

            return query.SingleOrDefault();
        }

        public IEnumerable<Cliente> ObtenerClientesPorCriterio(string nombre)
        {
            var query = (from c in Context.Clientes
                         .Include("TipoCliente")
                select c).Take(100);

            //filtro por nombre
            if (!string.IsNullOrEmpty(nombre))
            {
                query = (from c in query
                         where c.Nombres.ToUpper().Contains(nombre.ToUpper())
                         select c).Take(100);
            }

            return query.ToList();

        }

        public IEnumerable<Cliente> ObtenerTodosLosClientes()
        {
            var query = (from c in Context.Clientes
                         .Include("TipoCliente")
                         select c).Take(100);

            return query.ToList();
        }
    }
}
